package kr.pe.johnkim.sendme.rest;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.json.JSONArray;
import org.json.JSONObject;

import kr.pe.johnkim.sendme.provider.SendMeBlock;
import kr.pe.johnkim.sendme.provider.SendMeInstall;
import kr.pe.johnkim.sendme.provider.SendMeMember;
import kr.pe.johnkim.sendme.util.SendMeCommon;
import kr.pe.johnkim.sendme.util.SendMeConstant;
import android.util.Log;

public class SendMeBlockRest {

	public static String TAG = SendMeBlockRest.class.getSimpleName();
	
	
//	SendMeBlock	
//	phoneNumber	차단한 친구 휴대전화번호.(PK)
//	activateYn	활성화 여부.
//	modifyDate	수정 일자.
//	registerDate	등록 일자.
//	sendMeMemberPhoneNumber	사용자 휴대전화번호.(FK)
//	totalCount	총 갯수.
//	result	결과.

//	sendMeBlockController
//	
//	selectDuplicate	차단 등록하기전 중복을 확인 한다.			SendMeBlock.result
//	phoneNumber
//	sendMeMemberPhoneNumber	
//	activateYn	
//	
//registerBlock	차단을 등록 한다.	phoneNumber	SendMeBlock.result
//	activateYn	
//	modifyDate	
//	registerDate	
//	sendMeMemberPhoneNumber	
//	
//selectBlockList	차단 목록을 가져 온다.	activateYn	List<SendMeBlock>
//	sendMeMemberPhoneNumber	
//	
//updateBlock	차단을 업데이트 한다.	phoneNumber	SendMeBlock.result
//	activateYn	
//	modifyDate	
//	sendMeMemberPhoneNumber	

	
	
	/**
	 * 차단 등록하기전 중복을 확인 한다.
	 * 
	 * @param sendMeBlock
	 * @return
	 */
	public SendMeBlock selectDuplicate(SendMeBlock sendMeBlock) {
		Log.i(TAG, "selectDuplicate");
		
		String url = SendMeConstant.SERVER_URL
			+ SendMeConstant.MAPPING_CONTROLLER
			+ SendMeConstant.BLOCK_CONTROLLER
			+ SendMeConstant.BLOCK_SELECT_DUPLICATION;
		
		SendMeBlock result = new SendMeBlock();
		
		try {
			JSONObject parameterJsonObject = new JSONObject();
			parameterJsonObject.put("phoneNumber", sendMeBlock.getPhoneNumber());
			parameterJsonObject.put("sendMeMemberPhoneNumber", sendMeBlock.getSendMeMemberPhoneNumber());
//			parameterJsonObject.put("activateYn", sendMeBlock.getActivateYn());
			
			String resultStr = this.requestToServer(url, parameterJsonObject.toString());
			JSONObject resultJsonObject = new JSONObject(resultStr);
			String tempStr = resultJsonObject.getString("totalCount");
			// 정보 없음. 새로 등록
			if(tempStr.equals("0")){
				result.setTotalCount(resultJsonObject.getString("totalCount"));
//				result.setActivateYn(resultJsonObject.getString("activateYn"));		
			// 정보 있음. activateYn 값에 따라 다름	
			}else{
				// activateYn 값이 Y 일때 : 이미 차단 함. N일때 : 차단했다가 해제한 경우. 새로등록하지 않고 updateBlock 을 사용해서 차단한다
				result.setTotalCount(resultJsonObject.getString("totalCount"));
				result.setActivateYn(resultJsonObject.getString("activateYn"));		
			}
		} catch(Exception e) {
			e.printStackTrace();
		}
		
		return result;
	}
	
	/**
	 * 차단을 등록 한다.
	 * 
	 * @param sendMeBlock
	 * @return
	 */
	public SendMeBlock registerBlock(SendMeBlock sendMeBlock) {
		Log.i(TAG, "registerBlock");
		
		String url = SendMeConstant.SERVER_URL
			+ SendMeConstant.MAPPING_CONTROLLER
			+ SendMeConstant.BLOCK_CONTROLLER
			+ SendMeConstant.REGISTER_BLOCK;
		
		SendMeBlock result = new SendMeBlock();
		
		try {
			JSONObject parameterJsonObject = new JSONObject();
			parameterJsonObject.put("phoneNumber", sendMeBlock.getPhoneNumber());
			parameterJsonObject.put("activateYn", sendMeBlock.getActivateYn());
			parameterJsonObject.put("modifyDate", sendMeBlock.getModifyDate());
			parameterJsonObject.put("registerDate", sendMeBlock.getRegisterDate());
			parameterJsonObject.put("sendMeMemberPhoneNumber", sendMeBlock.getSendMeMemberPhoneNumber());
			
			String resultStr = this.requestToServer(url, parameterJsonObject.toString());
			Log.d(TAG,"resultStr:"+resultStr);
			JSONObject resultJsonObject = new JSONObject(resultStr);
			result.setResult(resultJsonObject.getString("result"));		
		} catch(Exception e) {
			e.printStackTrace();
		}
		
		return result;
	}
	
	/**
	 * 차단 목록을 가져 온다.
	 * 
	 * @param sendMeBlock
	 * @return
	 */
	public ArrayList<SendMeBlock> selectBlockList(SendMeBlock sendMeBlock) {
		Log.i(TAG, "selectBlockList");
		String url = SendMeConstant.SERVER_URL
			+ SendMeConstant.MAPPING_CONTROLLER
			+ SendMeConstant.BLOCK_CONTROLLER
			+ SendMeConstant.SELECT_BLOCK_LIST;
		
		ArrayList<SendMeBlock> result = null;
		
		
		
		try {
			JSONObject parameterJsonObject = new JSONObject();
			parameterJsonObject.put("activateYn", sendMeBlock.getActivateYn());
			parameterJsonObject.put("sendMeMemberPhoneNumber", sendMeBlock.getSendMeMemberPhoneNumber());
			
			String resultStr = this.requestToServer(url, parameterJsonObject.toString());
			Log.d(TAG,"resultStr:"+resultStr);
			JSONArray resultJsonArray = new JSONArray(resultStr);
			
			Log.d(TAG,"resultJsonArray:"+resultJsonArray.length());
			
			result = new ArrayList<SendMeBlock>();
			
			// 일반 시간 포맷
			SimpleDateFormat commonDateSimpleDateFormat = SendMeConstant.commonDateSimpleDateFormat;
			// 출력용 시간 포맷
			SimpleDateFormat receiveMessageDateSimpleDateFormat = SendMeConstant.receiveMessageDateSimpleDateFormat;
			
			String tempDate;		// 받아서
			Date date;				// Date 타입으로
			String sdfDate;			// 원하는 포맷으로
			
			for(int i=0; i<resultJsonArray.length(); i++){				
				JSONObject resultJsonObject = resultJsonArray.getJSONObject(i);
				
				SendMeBlock tempSendMeBlock = new SendMeBlock();
/*
 * 				 {"phoneNumber":"01088418653",
 * "activateYn":"Y",
 * "modifyDate":"2014-02-03 17:55:43",
 * "registerDate":"2014-02-03 17:55:43",
 * "sendMeMemberPhoneNumber":"01022173645",
 * 
 * "totalCount":null,"result":null}]
 */
				tempSendMeBlock.setPhoneNumber(resultJsonObject.getString("phoneNumber"));
				tempSendMeBlock.setActivateYn(resultJsonObject.getString("activateYn"));
				tempSendMeBlock.setNickName(resultJsonObject.getString("nickName"));
				
				tempSendMeBlock.setModifyDate(resultJsonObject.getString("registerDate"));			// -> 등록일 저장
				
				// 등록일 변환해서 넣음. ->  수정일 저장
				tempDate = resultJsonObject.getString("modifyDate");		// 받아서
				date = commonDateSimpleDateFormat.parse(tempDate);				// Date 타입으로
				sdfDate = receiveMessageDateSimpleDateFormat.format(date);	// 원하는 포맷으로
				tempSendMeBlock.setRegisterDate(sdfDate);							// 저장
				
				tempSendMeBlock.setSendMeMemberPhoneNumber(resultJsonObject.getString("sendMeMemberPhoneNumber"));
				// 가려 받는다. activateYn 값이 N인 것은 차단 해제한 것이므로 걸러내고 Y인 것만 저장해서 전달한다.
				if(resultJsonObject.getString("activateYn").equals("Y")){
					result.add(tempSendMeBlock);
				}
			}
			
			
		} catch(Exception e) {
			e.printStackTrace();
		}
		
		return result;
	}
	
	/**
	 * 차단을 업데이트 한다.
	 * 
	 * @param sendMeBlock
	 * @return
	 */
	public SendMeBlock updateBlock(SendMeBlock sendMeBlock) {
		Log.i(TAG, "updateBlock");
		
		String url = SendMeConstant.SERVER_URL
			+ SendMeConstant.MAPPING_CONTROLLER
			+ SendMeConstant.BLOCK_CONTROLLER
			+ SendMeConstant.UPDATE_BLOCK;
		
		SendMeBlock result = new SendMeBlock();
		
		SendMeCommon sendMeCommon = new SendMeCommon();
		String nowTime = sendMeCommon.getCurrentDate();
		
		try {
			JSONObject parameterJsonObject = new JSONObject();
			parameterJsonObject.put("phoneNumber", sendMeBlock.getPhoneNumber());
			
			parameterJsonObject.put("activateYn", sendMeBlock.getActivateYn());
			parameterJsonObject.put("modifyDate", nowTime);
			parameterJsonObject.put("sendMeMemberPhoneNumber", sendMeBlock.getSendMeMemberPhoneNumber());
			
			String resultStr = this.requestToServer(url, parameterJsonObject.toString());
			Log.d(TAG,"resultStr:"+resultStr);
			JSONObject resultJsonObject = new JSONObject(resultStr);
			result.setResult(resultJsonObject.getString("result"));		
		} catch(Exception e) {
			e.printStackTrace();
		}
		
		return result;
	}
	
	
	
	
	/**
	 * http protocal 을 사용하는 서버 요청 공통 메소드.
	 * 요청 후 결과를 json string 으로 받아서 반환 한다.
	 * 
	 * @param url
	 * @param inputJsonString
	 * @return
	 */
	public String requestToServer(String url, String inputJsonString) {
		Log.i(TAG, "requestToServer");
		
		String result = "";
		
		try {
			URL postUrl = new URL(url);
			HttpURLConnection connection = (HttpURLConnection) postUrl.openConnection();
	        connection.setDoOutput(true);
	        connection.setInstanceFollowRedirects(false);
	        connection.setRequestMethod("POST");
	        connection.setRequestProperty("Content-Type", "application/json");
	        OutputStream os = connection.getOutputStream();
	        os.write(inputJsonString.getBytes());
	        os.flush();
	        
	        if(connection != null) {
	        	connection.setConnectTimeout(3000);
	        	
	        	if(connection.getResponseCode() == HttpURLConnection.HTTP_OK) {
	        		BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
	        		result = bufferedReader.readLine();
	        	}
	        }
		} catch(Exception e) {
			e.printStackTrace();
		}
		
		return result;
	}
}
